package gestioneDatabase.Post;

import filter.FilterPostsByAuthorName;
import filter.FilterPostsByTitle;

import java.util.ArrayList;

import models.Post;
import models.User;

/**
 * Singleton Gestisce l'inserimento e la ricerca dei post nel database
 * 
 */

public class PostsManager {

	private AllPostsRetriever postRetriver = new AllPostsRetriever();
	private PostInserter postInserter;

	private PostsManager() {

	}

	private static PostsManager postsManager = new PostsManager();
	
	/**
	 * Metodo usato dalle altre classi per poter richiamare getManager
	 * @return
	 * 			L'unica istanza di PostsManager
	 */
	public static PostsManager getManager() {
		return postsManager;
	}

	/**
	 * Restituisce tutti i post presenti nel database.
	 * 
	 * @return 
	 * 			ArrayList di tutti i post presenti nel database
	 * 
	 */

	public ArrayList<Post> getAllPostsList() {
		return postRetriver.getPosts();
	}

	/**
	 * Permette l'inserimento di un post nel database
	 * 
	 * @param author
	 *            autore del post
	 * @param title
	 *            titolo del post
	 * @param content
	 *            contenuto del post
	 */

	public void insertPost(User author, String title, String content,
			String style) {
		ArrayList<Post> allPosts = postRetriver.getPosts();
		int lastID = -1;
		for (int i = 0; i < allPosts.size(); i++) {
			if (allPosts.get(i).getId() > lastID)
				lastID = allPosts.get(i).getId();
		}
		
		Post post=fillSinglePost(lastID+1, author.getFullName(), title, content, style);
		postInserter = new PostInserter(post);
		postInserter.execute();
	}

	/**
	 * Ricerca i post che contengono il parametro passatogli
	 * 
	 * @param identifier
	 *            parametro su cui basare la ricerca
	 * @return ArrayList di tutti i post filtrati
	 */

	public ArrayList<Post> searchPostsWithFilter(String identifier) {
		final FilterPostsByTitle filterByTitle = new FilterPostsByTitle(
				identifier);
		final FilterPostsByAuthorName filterByAuthor = new FilterPostsByAuthorName(
				identifier);
		final ArrayList<Post> resultOfFilterByTitle = filterByTitle
				.applyFilter(postRetriver.getPosts());
		final ArrayList<Post> resultOfFilterByAuthor = filterByAuthor
				.applyFilter(postRetriver.getPosts());

		ArrayList<Post> mergedResults = new ArrayList<Post>();
		mergedResults.addAll(resultOfFilterByAuthor);
		mergedResults.addAll(resultOfFilterByTitle);

		return mergedResults;
	}

	/**
	 * Ricerca un post in base all'id
	 * 
	 * @param id
	 * @return il post relativo alla ricerca, null se non � presente
	 */

	public Post getPostByID(Integer id) {
		ArrayList<Post> allPosts = postRetriver.getPosts();
		for (Post post : allPosts) {
			if (post.getId() == id) {
				return post;
			}
		}
		return null;
	}
	
	/**
	 * Crea un post coi parametri passati
	 * @param id
	 * 		L'id del post
	 * 
	 * @param author
	 * 		Il nome dell'autore
	 * 
	 * @param title
	 * 		Il titolo del post
	 * 
	 * @param content
	 * 		Il contenuto del post
	 * 
	 * @param style
	 * 		Lo stile per il post
	 * 
	 * @return
	 * 		Il post riempito.
	 */
	public Post fillSinglePost(int id, String author, String title,
			String content, String style) {
		User user = new User(author);
		Post post = new Post(user);
		post.setId(id);
		post.setContent(content);
		post.setTitle(title);
		post.setStyle(style);
		return post;
	}

}
